#ifndef STATEMACHINE_H
#define STATEMACHINE_H

#include <QObject>
#include "widget.h" // 包含Widget头文件

#include "ui_widget.h"

#include <QStateMachine>
#include <QState>
#include <QFinalState>
#include <QDateTime>
#include <QTimer>

class Widget;


// 日志类型枚举类
enum class LogType {
    Info,
    Success,
    Warning,
    Error
};

// 颜色的枚举类
enum class StatusColor {
    Error = 0xFF6347,    // 番茄红色 (Tomato)
    Normal = Qt::black,  // 黑色
    Success = 0x32CD32,  // 酸橙绿色 (Lime Green)
    Warning = 0xFFD700,  // 金色
    Other = 0x696969    // 深灰色 (Dim Gray)
};

class myStateMachine : public QObject {
    Q_OBJECT

public:
    explicit myStateMachine(Widget *widget, QObject *parent = nullptr);
//    void start();

public:
    void InitMachine();// 初始化状态机

    void initMachineConnectEnteredExited();// 连接信号槽

    QColor getColor(StatusColor status);    // 获取颜色

    template<typename T>
    void setTextColor(T *widget, const QString &text, StatusColor status); // 设置QLabel、QLineEdit的Text颜色

    bool conutDelay(int delayTime = 3); // 倒数计数，延时

    void initIniManager();

signals:
    void toNextState(); // 跳转下一个状态

    void toStateWork(); // 调用当前工作任务

    void toResetStatus();// 跳转复位状态

    void toInitStatus(); // 跳转到初始化

    // PLC
    void sendModbusRequest(uint8_t functionCode, uint16_t address, uint16_t value); // 发送指令请求
    void sendPulse(uint8_t functionCode, uint16_t address); // 发送脉冲


    // 光源
    void sendTopLigth(uint8_t value);   // 顶部
    void sendSideLigth(uint8_t value);  // 侧面
    void sendFillLigth(uint8_t value);  // 补光
    void sendBottomLigth(uint8_t value);// 底部
    void sendAllLigth(uint8_t value);   // 全部

    // 镜头
    void sendSideFormSetData(int16_t angle);// 侧面相机
    void sendTopFormSetData(int16_t angle); // 顶部相机

    // 初始化焦距
    void initTopFocus();
    void initSideFocus();

    // 镜头焦距和光源亮度

    void setTopCamFocusLight(const int focus, const uint8_t light);
    void setSideCamFocusLight(const int focus, const uint8_t light, const uint8_t fill);

    // 拍照
    void sendTopPhoto();
    void sendAFacePhoto();
    void sendBFacePhoto();
    void sendCFacePhoto();
    void sendDFacePhoto();
    void sendBottomPhoto();

    // 新增工作组
    void sendNewWorkGroup(QString productClass);

    // 切换工作组
    void sendUpdatePlcGroup(QString productUniqueCode);

    // 点击【获取任务】
    void sendClickBtnGetCsv();

    // 点击【停止获取】
    void sendClickBtnStop();

    // 更新当前选中组
    void sendUpdateCurrentGroup(QString groupId);

    // 初始化焦距
    void sendInitFocus();

    // 弹出信息提示框
    void sendQuestionPopup(QString text);

private:
    // 读取时间配置
    void readTimeConfig();

    void setAllBotton(const bool &enable);

    bool getCsvFile(const QString &csvPath);

    bool isExitsScvFile(const QString &csvPath);

    QList<QMap<QString, QVariant>> readCsvFile(const QString &csvPath);

    QString getDataByRowAndColumn(const QList<QMap<QString, QVariant>> &csvDataList, int row, const QString &column);

    QMap<QString, QVariant> getRowData(const QList<QMap<QString, QVariant>> &csvDataList, int row);

private slots:

    //  状态工作任务
    void do_getCsvWork();// 获取任务
    void do_initWork(); // 初始化
    void do_topPhotoWork();// 顶部相机
    void do_AFacePhotoWork();// A面相机拍照
    void do_BFacePhotoWork();// B面相机拍照
    void do_CFacePhotoWork();// C面相机拍照
    void do_DFacePhotoWork();// D面相机拍照
    void do_bottomPhotoWork();// 底部相机拍照
    void do_cuttingWork();  // 下料

    void do_resetWork();    // 复位

    // 其他
    void do_clearAllFlag(); // 清空所有标志位


    void showEntered(const QString &text);  // 显示状态进入
    void showExited(const QString &text);   // 显示状态退出

    bool showMessage(const QString& title, const QString& message); // 显示信息弹窗

    void do_plcResetPopup();// 复位弹窗

    void timerout();
private:
    Widget *pUi = nullptr; // 指向Widget的指针

    // 状态机
    bool m_nextStatus = true;

    QStateMachine *m_machine = nullptr;

    QState *m_resetStatus = nullptr;

    QState *m_getCsvStatus = nullptr;
    QState *m_initStatus = nullptr;
    QState *m_topPhotoStatus = nullptr;
    QState *m_AFacePhotoStatus = nullptr;
    QState *m_BFacePhotoStatus = nullptr;
    QState *m_CFacePhotoStatus = nullptr;
    QState *m_DFacePhotoStatus = nullptr;
    QState *m_bottomPhotoStatus = nullptr;
    QState *m_cuttingStatus = nullptr;

//    QFinalState *m_finalStatus = nullptr;

    QString m_csvPath;

    bool m_csvFlag; // csv文件标志位


    int m_conutTime = 0;

    int m_resetTime = 15;   // 复位时间，默认固定15秒
//    int m_getCsvTime;
    int m_initTime;
    int m_topPhotoTime;
    int m_AFacePhotoTime;
    int m_BFacePhotoTime;
    int m_CFacePhotoTime;
    int m_DFacePhotoTime;
    int m_bottomPhotoTime;
    int m_cuttingTime;

//    iniManager *m_iniManager = nullptr;

    iniManager *m_iniSystem = nullptr;

    iniManager *m_iniWorkGroup = nullptr;

    QString m_productClass;

    QString m_productCode;
    QString m_materialNo;
    QString m_workProcedureSequence;

    QString m_csvGroup;


    QString m_startTimeString;
    QDateTime m_startTime;

    bool m_startTimeFlag = false;

    int m_startTask=0;
    QTimer m_startTaskTimer;
};

#endif // STATEMACHINE_H
